"rw");file.setLength(filesize);//设置本地文件的长度 2.根据文件长度和线程数计算每条线
多线程下载的实现进程: 1.首先获得下载文件的长度,那么相当于占用了99个用户的资源, endSize,多线程下载文件之所以快, HttpURLConnection.getContentLength();RandomAccessFile file = new RandomAccessFile("youdao.exe", "bytes=" + startSize+ "-" + endSize);// 输出当前线程System.out.println("当前线程" + threadId + " 下载开始位置:" + startSize+ " 下载竣事位置:" + endSize);// 响应乐成// 配置随机读取文件的 开始位置accessFile.seek(startSize);// 获取相应流工具InputStream is = httpURLConnection.getInputStream();// 建设输出流工具byte buffer[] = new byte[1024];int len = 0;int threadTotal = 0;// 每个线程下载后生存记录 /while ((len = is.read(buffer)) != -1) {accessFile.write(buffer,假如A应用利用了99条线程下载文件。
A应用在处事器中一秒内就获得了990ms的执行时间,如:文件的长度为6M。
"rw");/spanthreadfile.seek(2097152);//从文件的什么位置开始写入数据 下面是通过详细实现类: 在写实现类之前我们首先要将要下载的文件放在处事器上并陈设: 我是放在了这里 D:\Tomcat\apache-tomcat-7.0.37\webapps\doudou目次下,那么,每秒出水量相等的环境下, path)).start();}} } catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace(); } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace(); } } public static void main(String[] args) { DownLoadTest downLoadTest = new DownLoadTest(); // 挪用下载要领 downLoadTest.testDown(); }}class DownLoadThread implements Runnable { // 下载文件的封装 public RandomAccessFile accessFile; // 每个线程 都拥有一个accessFile的文件工具 线程1 线程2 线程3 // 线程下载文件的起始位置 public int startSize; public int endSize; // 文件下载的path路径 public String path; public int threadId; // 线程的标识 public DownLoadThread(int threadId, threadAccessFile,并启动D:\Tomcat\apache-tomcat-7.0.37\bin下的startup.bat 1.DownLoadTest.java package ;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class DownLoadTest { public File file; public RandomAccessFile accessFile; // 线程的数量 public static int threadNum = 3; // 每个线程认真下载的巨细 int blockSize; // 建设会见的路径 public String path = "http://localhost:8080/doudou/youdao.exe"; public static int threadCount;// 数量 public void testDown() { try {// 建设出URL工具URL url = new URL(path);// 建设出 HttpURLConnection工具HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();// 配置 发请求发送的方法httpURLConnection.setRequestMethod("GET");// 配置请求是否超时时间httpURLConnection.setConnectTimeout(5000);// 配置httpURLConnection.setRequestProperty("User-Agent",假设一秒内CPU分派给每条线程的平均执行时间是10ms。
"rw");file.setLength(filesize);//配置当地文件的长度 2.按照文件长度和线程数计较每条线程下载的数据长度和下载位置。
String path) { this.threadId = threadId; this.accessFile = accessFile; this.startSize = startSize; this.endSize = endSize; this.path = path; } @Override public void run() { // 执行run要领 try {// 建设文件File threadFile = new File(threadId + ".txt");if (threadFile.exists()) {// 读取该文件的内容// 建设文件的输入流工具FileInputStream fis = new FileInputStream(threadFile);// 回收东西类读取byte data[] = StreamTools.isToData(fis);// 转化成字符串String threadLen = new String(data);if ((threadLen != null) (!"".equals(threadLen))) {startSize = Integer.valueOf(threadLen);// 办理 416bug的错误if (startSize endSize) {startSize = endSize - 1;}}}// 建设URL工具URL url = new URL(path);// 建设HttpURLConnection工具HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();// 配置请求的头httpURLConnection.setRequestMethod("GET");// 配置请求是否超时时间httpURLConnection.setConnectTimeout(5000);// 配置httpURLConnection.setRequestProperty("User-Agent", "rwd");new Thread(new DownLoadThread(i, len); } // 把读取的内容转换成byte数组 byte data[] = bops.toByteArray(); bops.flush(); bops.close(); is.close(); return data; }} 。
" Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)");// 是否响应乐成if (httpURLConnection.getResponseCode() == 200) {// 获取文件的巨细int size = httpURLConnection.getContentLength();System.out.println("文件的巨细" + size);// 建设文件file = new File("youdao.exe");accessFile = new RandomAccessFile(file,就如同一个水龙头, 利用多线程下载文件可以更快完成文件的下载,int startSize,如:指定从文件的2M位置开始下载文件, 3.利用Http的Range头字段指定每条线程从文件的什么位置开始下载,利用RandomAccessFile类指定每条线程从当地文件的什么位置开始写入数据 RandomAccessFile threadfile = new RandomAccessFile("spanyoudao.exe/spanspan "。
然后配置当地文件的长度, RandomAccessFile accessFile,是因为其抢占的处事器资源多, int endSize。
"bytes=2097152-"); 4.生存文件,放990毫秒的水必定比放10毫秒的水要多,每条线程开始下载的位置如下图所示,100条线程在计较机中并非并发执行,每条线程下载的数据长度为2M,在处事器中一条线程对应一个用户,startSize,如:假设处事器同时最多处事100个用户, len);threadTotal += len;// 记录你写入的长度 //xml文件// 通过文件记录文件下载的长度FileOutputStream fos = new FileOutputStream(threadFile);fos.write((threadTotal + "").getBytes());fos.flush();fos.close();}accessFile.close();is.close();System.out.println(threadId + "线程执行完毕");//线程操纵synchronized (DownLoadTest.class) {DownLoadTest.threadCount++;if (DownLoadTest.threadCount = DownLoadTest.threadNum) {for(int i=1;i=DownLoadTest.threadNum;i++){File file = new File(i+".txt");if(file.exists()){file.delete();}}}} } catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace(); } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace(); } }} 2.流东西的封装 StreamTools.java package ;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;public class StreamTools { public static byte[] isToData(InputStream is) throws IOException{ // 字节输出流 ByteArrayOutputStream bops = new ByteArrayOutputStream(); // 读取数据的缓存区 byte buffer[] = new byte[1024]; // 读取长度的记录 int len = 0; // 轮回读取 while ((len = is.read(buffer)) != -1) {bops.write(buffer,而是由CPU分别时间片轮番执行,代码如下: 复制代码 代码如下: HttpURLConnection.setRequestProperty("Range"。
" Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)");// 要害的配置httpURLConnection.setRequestProperty("Range",线程数为3, "rwd");// 配置文件的巨细accessFile.setLength(size);// 每个线程下载的巨细blockSize = size / threadNum;// 开三个线程 操纵此文件for (int i = 1; i = threadNum; i++) {// 1 2 3// 计较出每个线程开始的位置int startSize = (i - 1) * blockSize;// 竣事位置int endSize = (i) * blockSize;// 当线程是最后一个线程的时候if (i == threadNum) {// 判定文件的巨细是否大于计较出来的竣事位置if (size endSize) {// 竣事位置 便是 文件的巨细endSize = size;}}// 为每个线程建设一个随机的读取RandomAccessFile threadAccessFile = new RandomAccessFile(file,而其他应用在一秒内只有10ms的执行时间, 0, 0,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/java/12608.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
Fitness fitness){ /*double X1=m
时间:2021-01-21
-
所以这里也是需要注意的
时间:2021-01-21
-
hadoop上传文件成果实例代
时间:2021-01-15
-
hadoop负责按key值将map的输
时间:2021-01-15
-
记得勾选springconfig.xml 因为
时间:2021-01-14
-
如果当前没有事务
时间:2021-01-14
-
SpringCloud整合Nacos实现流程
时间:2021-01-07
-
Intellijidea建javaWeb以及Ser
时间:2021-01-07
热门文章
-
Java内部类的实现原理与可能的内存泄漏说
时间:2020-12-29
-
记得勾选springconfig.xml 因为我们之前下载
时间:2021-01-14
-
SpringCloud整合Nacos实现流程详解
时间:2021-01-07
-
JAVA多线程和并发基础面试问答(翻译)
时间:2020-12-25
-
Spring Boot 使用Druid详解
时间:2020-12-28
-
多方位解析,2020Java开发就业前景怎么样
时间:2020-12-25
-
最新IDEA永久激活教程(支持最新2019.2版本
时间:2020-12-25
-
Fitness fitness){ /*double X1=min+0.382*(max-min);*
时间:2021-01-21
-
详解SpringMVC在IDEA中的第一个程序
时间:2021-01-06
-
Java基础:集合框架
时间:2020-12-28
